package com.fuyun.rpc.common.trace;

/**
 * 链路追踪上下文管理器
 */
public class TraceContextManager {

	private static final ThreadLocal<TraceContext> CONTEXT_HOLDER = new ThreadLocal<>();

	/**
	 * 设置当前线程的追踪上下文
	 * @param context 追踪上下文
	 */
	public static void setContext(TraceContext context) {
		CONTEXT_HOLDER.set(context);
	}

	/**
	 * 获取当前线程的追踪上下文
	 * @return 追踪上下文
	 */
	public static TraceContext getContext() {
		return CONTEXT_HOLDER.get();
	}

	/**
	 * 清除当前线程的追踪上下文
	 */
	public static void clearContext() {
		CONTEXT_HOLDER.remove();
	}

	/**
	 * 创建新的追踪上下文
	 * @param serviceName 服务名称
	 * @param methodName 方法名称
	 * @return 新的追踪上下文
	 */
	public static TraceContext createNewContext(String serviceName, String methodName) {
		TraceContext context = new TraceContext();
		context.setServiceName(serviceName);
		context.setMethodName(methodName);
		setContext(context);
		return context;
	}

	/**
	 * 基于父上下文创建子追踪上下文
	 * @param parentContext 父追踪上下文
	 * @param serviceName 服务名称
	 * @param methodName 方法名称
	 * @return 子追踪上下文
	 */
	public static TraceContext createChildContext(TraceContext parentContext, String serviceName, String methodName) {
		TraceContext context = new TraceContext(parentContext.getTraceId(), parentContext.getSpanId());
		context.setServiceName(serviceName);
		context.setMethodName(methodName);
		setContext(context);
		return context;
	}
}